#include <ros/ros.h>
#include <std_msgs/String.h>

// 需求：
/*
    消息发布方:
        循环发布信息:Hello_World 后缀数字编号
*/

// 步骤：
/*
    1.包含头文件 
    2.初始化 ROS 节点:命名(唯一)
    3.实例化 ROS 句柄
    4.实例化 发布者 对象
    5.组织被发布的数据，并编写逻辑发布数据
*/

int main(int argc, char *argv[])
{
    // 设置编码
    setlocale(LC_ALL,"");
    // 初始化 ROS 节点
    ros::init(argc,argv,"talker_cpp");
    // 实例化 ROS 句柄
    ros::NodeHandle nh; // 该类封装了 ROS 中的一些常用功能
    // 实例化 发布者 对象
    /*
    泛型: 发布的消息类型
    参数1: 要发布到的话题
    参数2: 队列中最大保存的消息数，超出此阀值时，先进的先销毁(时间早的先销毁)
    */
    ros::Publisher pub = nh.advertise<std_msgs::String>("first_topic",10);

    // 组织被发布的数据，并编写逻辑发布数据
    std_msgs::String msg;   // 数据(动态组织)
    std::string imformation = "Hello_World";    //消息前缀
    int count = 0;  //消息计数器
    ros::Rate rate(1);  //逻辑(一秒1次)
     ros::Duration(3.0).sleep();    // 延迟第一条数据的发送,防止第一条数据丢失
    while (ros::ok())   // 节点不死
    {
        std::stringstream ss;   //使用 stringstream 拼接字符串与编号
        ss << imformation << count;
        msg.data = ss.str();
        pub.publish(msg);   // 发布消息
        ROS_INFO("发布的消息为：%s", msg.data.c_str());
        rate.sleep();
        count++;
        ros::spinOnce();
    }
    
    
    return 0;
}

// 配置CMakeLists.txt
/*
    add_executable(文件名称
    src/文件名称.cpp
    )

    target_link_libraries(文件名称
    ${catkin_LIBRARIES}
    )
*/